package com.yunsc.system.utils;

import com.aliyun.auth.credentials.Credential;
import com.aliyun.auth.credentials.provider.StaticCredentialProvider;
import com.aliyun.sdk.service.dysmsapi20170525.AsyncClient;
import com.aliyun.sdk.service.dysmsapi20170525.models.SendSmsRequest;
import com.aliyun.sdk.service.dysmsapi20170525.models.SendSmsResponse;
import com.tencentcloudapi.common.exception.TencentCloudSDKException;
import com.tencentcloudapi.sms.v20190711.SmsClient;
import com.yunsc.common.exception.YunscException;
import darabonba.core.client.ClientOverrideConfiguration;

import java.util.concurrent.CompletableFuture;

/**
 * 短信发送工具类
 */
public class SMSUtils {
    /*
     * 发送短信
     * @param signName 签名
     * @param templateCode 模板
     * @param phoneNumbers 手机号
     * @param param 参数
     */
    public static void sendMessage(String signName, String templateCode, String phoneNumbers, String param, String accessKeyId, String accessKeySecret) {
        // DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou", "LTAI5tGRcbkg4NNHmj3wfW75", "3D1iaTqHwjxvpFNKaSt39vhcO9K4qL");
        // 配置Credentials认证信息，包括ak、secret、token
        StaticCredentialProvider provider = StaticCredentialProvider.create(Credential.builder()
                .accessKeyId(accessKeyId)
                .accessKeySecret(accessKeySecret)
                // .accessKeyId("LTAI5tGRcbkg4NNHmj3wfW75")
                // .accessKeySecret("3D1iaTqHwjxvpFNKaSt39vhcO9K4qL")
                .build());

        // 配置客户端
        AsyncClient client = AsyncClient.builder()
                .region("cn-hangzhou")
                .credentialsProvider(provider)
                .overrideConfiguration(
                        ClientOverrideConfiguration.create()
                                .setEndpointOverride("dysmsapi.aliyuncs.com")
                        //.setConnectTimeout(Duration.ofSeconds(30))
                )
                .build();
        // API请求参数设置
        SendSmsRequest sendSmsRequest = SendSmsRequest.builder()
                .phoneNumbers(phoneNumbers)
                .signName(signName)
                .templateCode(templateCode)
                .templateParam("{\"code\":\""+param+"\"}")
                // Request-level configuration rewrite, can set Http request parameters, etc.
                // .requestConfiguration(RequestConfiguration.create().setHttpHeaders(new HttpHeaders()))
                .build();
        try {
            // 异步获取API请求的返回值
            CompletableFuture<SendSmsResponse> response = client.sendSms(sendSmsRequest);
            // 打印您需要的返回值，此处打印的是此次请求的 RequestId
            SendSmsResponse resp = response.get();
            String message = resp.getBody().getMessage();
            String requestId = resp.getBody().getRequestId();
            System.out.println("短信发送结果：" + message + "，请求ID：" + requestId);
        } catch (Exception e) {
            // 打印错误码
            // e.printStackTrace();
            System.out.println("错误异常信息:" + e.getMessage());
        } finally {
            // 关闭客户端
            client.close();
        }

    }



    /**
     * 腾讯云发送短信的基础服务
     * @param secretId       腾讯云账户密钥对 secretId
     * @param secretKey      腾讯云账户密钥对 secretKey
     * @param appId          腾讯云短信应用id
     * @param signName       腾讯云短信签名
     * @param templateId     腾讯云短信模板id
     * @param templateParams 腾讯云模板需要的参数
     * @param phoneNumbers   手机号集合
     * @return 发送短信后的状态的set集合
     */
    public static void sendQcloudMessage(String secretId, String secretKey, String appId,String signName, String templateId, String[] templateParams,
                                       String[] phoneNumbers) {
        /*
          实例化一个认证对象，入参需要传入腾讯云账户密钥对 secretId 和 secretKey
          CAM 密钥查询：https://console.cloud.tencent.com/cam/capi
         */
        com.tencentcloudapi.common.Credential cred = new com.tencentcloudapi.common.Credential(secretId, secretKey);
        /*
          实例化要请求产品(以sms为例)的client对象
          第二个参数是地域信息，可以直接填写字符串ap-guangzhou，或者引用预设的常量
         */
        SmsClient client = new SmsClient(cred, "ap-guangzhou");
        /*
          实例化一个请求对象，根据调用的接口和实际情况，可以进一步设置请求参数
         */
        com.tencentcloudapi.sms.v20190711.models.SendSmsRequest req = new com.tencentcloudapi.sms.v20190711.models.SendSmsRequest();
        //短信应用ID: 短信appId在 [短信控制台] 添加应用后生成的实际SdkAppid，示例如1400006666
        req.setSmsSdkAppid(appId);
        //短信签名内容: 使用 UTF-8 编码，必须填写已审核通过的签名，签名信息可登录 [短信控制台] 查看
        req.setSign(signName);
        //模板 ID: 必须填写已审核通过的模板 ID。模板ID可登录 [短信控制台] 查看
        req.setTemplateID(templateId);
        //下发手机号码，采用 e.164 标准，+[国家或地区码][手机号]  示例如：+8613711112222， 其中前面有一个+号 ，86为国家码，13711112222为手机号，最多不要超过200个手机号
        req.setPhoneNumberSet(phoneNumbers);
        //模板参数: 若无模板参数，则设置为空
        req.setTemplateParamSet(templateParams);

        /* 通过 client 对象调用 SendSms 方法发起请求。注意请求方法名与请求对象是对应的
           返回的 res 是一个 SendSmsResponse 类的实例，与请求对象对应
         */
        com.tencentcloudapi.sms.v20190711.models.SendSmsResponse res = null;
        try {
            //发送短信
            res = client.SendSms(req);
        } catch (TencentCloudSDKException e) {
            e.printStackTrace();
            //发送短信失败
            throw new YunscException("发送短信失败");
        }
    }

    // public static void main(String[] args) {
    // 	// sendMessage("瑞吉外卖", "SMS_272140148", "19897513685", "4562", "LTAI5tGRcbkg4NNHmj3wfW75", "3D1iaTqHwjxvpFNKaSt39vhcO9K4qL"3D1iaTqHwjxvpFNKaSt39vhcO9K4qL);
    //     // sendQcloudMessage();
    //
    // }

    public static void main(String[] args) {
        String[] phoneNumbers = {"+8619378969005"};
        String[] templateParam = {"200627"};
        SMSUtils.sendQcloudMessage("AKIDSikYDasx8e4MVT9eEfrsz2udS7ZxGRRD",
                "jsnT0Z5SqT0JZidbgrsgLxLVWLA8sQoz",
                "1400917824",
                "云上orange公众号",
                "2185028",
                templateParam,
                phoneNumbers
        );
    }



}
